package com.example.demo.error;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.validation.ConstraintViolationException;
import java.util.List;

/**
 * @author yuwc
 * @description 统一异常处理
 * @data 2019/5/20 0020上午 10:07
 * 备注 ： ControllerAdvice//所谓加强Controller就是@ControllerAdvice注解，有这个注解的类中的方法的某些注解会应用到所有的Controller里，其中就包括@ExceptionHandler注解。
 * ResponseBody//REST风格接口
 */
@ControllerAdvice
@ResponseBody
public class GlobleExceptionHandler {
     private  static  final Logger log=LoggerFactory.getLogger(GlobleExceptionHandler.class);
     /**
      *功能描述: 异常统一处理，主要为了抓取spring boot validation 异常 获取单个验证出错返回
      * @author yuwc
      * @param  * @param request
      * @param e
      * @return
      *备注  异常处理(@ControllerAdvice注解注释的controller层和此注解注释的方法,会对所有controller层抛出的异常进行统一处理)
      */
    @ExceptionHandler(value = Exception.class)
    public String ExceptionHandler(HttpServletRequest request, Exception e){
        if (e instanceof BindException){
            BindException ex = (BindException)e;
            //捕获的所有错误对象
            List<ObjectError> allErrors = ex.getAllErrors();
            ObjectError error = allErrors.get(0);
            //异常内容
            String defaultMessage = error.getDefaultMessage();
            log.info(defaultMessage);
            return defaultMessage;
        }else {
            return "";
        }
    }
}
